#include <stdio.h>

struct ListArray
{
    struct ListArray * pre;
    struct ListArray * next;
};

int main(){
    int n,m;
    int i,j,k;
    
    ListArray** array;
    while (scanf("%d %d",&n,&m)!=EOF)
    {
        if(n==0&&m==0)
        {
            break;
        }
        n++;
        array=new ListArray*[n];
        for(i=1;i<n;i++)
        {
            ListArray* item=new ListArray;
            item->next=NULL;
            item->pre=NULL;
            array[i]=item; 
        }

        for(i=0;i<m;i++)
        {
            scanf("%d %d",&j,&k);
            
            ListArray* start1=array[j];
            ListArray* start2=array[k];

            //取2条链表的头部 检查是不是在一个链表里面
            while (start1->pre!=NULL)
            {
                start1=start1->pre;
            }
            while (start2->pre!=NULL)
            {
                start2=start2->pre;
            }

            //如果不在一个链表里面 就接入前面的链表尾部
            if(start1!=start2)
            {
                ListArray* end=array[j];
                while (end->next!=NULL)
                {
                    end=end->next;
                }
                
                end->next=start2;
                start2->pre=end;
            }
            
            
        }
        int sum=0;
        //数链表表头有多少个
        for(i=1;i<n;i++)
        {
            if(array[i]->pre==NULL)
            {
                sum++;
            }
        }

        printf("%d\n",sum);

        for(i=1;i<n;i++)
        {
            delete array[i];
        }
        delete array;
    }
    
    return 0;
}
